ADC
 
 
 Bean ADC
 
A/D converter

Typical usage of the bean in user's code.

Typical Usage Typické použitie:

The examples are accompanied by sequence charts which demonstrate the sequence of calling the methods and events and internal processing of the A/D conversion. These charts show detailed information about ADC bean algorithm for typical usage of this bean. Each chart is composed of three processes. The first ADC peripheral process represents a function of the internal ADC peripheral module of CPU. Second ADC bean process represents a generated ADC bean code (interrupt routines, methods). Third User application process represents a user written code. Second and third processes are processed by CPU core, thus they cannot be performed concurrently and the control flow of CPU core is divided into these processes.
Príklady sú doplnené o zobrazenia priebehov ktoré demonštrujú sekvencie volajúcich metódy a udalosti a vnútorné procesy, ktoré predstavujú A/D konverziu. Tieto obrázky predstavujú detailné informácie o  algoritmoch ADC beanu  v ich typickom použití. Každý obrázok je zostavený z troch procesov. Prvý ADC proces periférie predstavuje funkciu interného ADC modulu procesora. Druhý proces ADC beanu predstavuje generovaný kód ADC beanu (podprogram obsluhy prerušení, metódy). Tretí Aplikačný proces predstavuje užívateľom napísaný kód. Druhý a tretí proces je vykonávaný jadrom CPU, preto oni nemôžu byť vykonávané kokurenčne a riadiaci tok CPU jadra je rozdelený do týchto procesov. 

The meaning of the colors used in the diagrams Jednotlivé významy používané v diagramoch zhora: 

  1. Užívateľský aplikačný kód v hlavnom module
  2. Kód metódy v beane
  3. Kód obsluhy prerušenia v beane
  4. Užívateľský aplikačný kód v module udalostí volaný z prerušenia.
  5. A/D konvertor vykonáva konverziu.
  6. Volanie metódy alebo výskyt udalosti
  7. Návrat z metódy, udalosti alebo prerušenia.
  8. Prerušenie.

 



Typical settings and usage of ADC bean
Typické nastavenie a použitie ADC beanu (prevodníka ANALOG na DIGITAL)


(1) Continuous conversion of all channels, with interrupt service

Kontinuálna konverzia všetkých kanálov, so službou prerušenia

Conversion of all channels/samples is performed repeatedly (using interrupts).
Property Interrupt service is enabled, Number of conversion is set to 1. Conversion is started using Start method. When a conversion of all channels/samples is finished the OnEnd event is invoked and a new set of measured values is available. All these measured values are available for reading until the next measurement cycle is finished. Conversion can be stopped using Stop method.

Konverzia všetkých kanálov/vzoriek je prevádzaná opakovane (s použitím prerušení). Vlastnosť Služba prerušenia ( Interrupt service ) je povolená, počet konverzií ( Number of conversion ) je nastavený na 1. Konverzi aje odštartovaná použitím metódy Start ( Start  ). Keď konverzia všetkých kanálov/vzoriek je ukončená vyvolá sa udalosť  OnEnd a je k dispozícii nová množina nameraných hodnôt. Všetky tieto namerané hodnoty sú dostupné na čítanie pokiaľ sa nedokončí nový cyklus meraní. Konverzia môže byť ukončená použitím metódy  Stop  .

The example demonstrates the continuous conversion of three channels/samples.
Príklady demonštrujú kontinuálnu konverziu troch kanálov/vzoriek. 

POZNÁMKA K PROGRAMU

Príklady treba brať s rezervou pretože slúžia len pre demonštračné príklady. 

Popis algoritmov: Hlavný modul MAIN.C na začiatku zadefinuje konštantu počtu meraní. Zadefinuje pole výsledkov z troch kanálov 0, 1 a 2 t.j. tri vzorky. Príkaz AD1_Start(); odštartuje celý proces merania na pozadí. Potom aplikácia v hlavnom programe vojde do nekonečnej slučky.  Hardware prevodníka zatiaľ vykonáva merania  v ktorej sa zistia tri vzorky a umiestnia sa do poľa Values zadefinovanom v hlavnom programe. Prevzatie nameraných hodnôt sa uskutoční po vyvolaní prerušenia hardwarom (vid EVENTS.C). Prerušenie má za úlohu dve veci: jednak prvezme vysledky a jednak zvýši počítadlo meraní v ktorom signalizuje ktorá séria vzorkovania prebehla. tento údaj je taktiež umiestnený v hlavnom module a predstavuje správu modulu EVENTS.C modulu MAIN.C. 

V hlavnom module sa uskutoční 10 meraní po ktorých sa zastaví generovanie prerušení príkazom.  Počet meraní indikuje globálna premenná ktorej hodnota sa v module EVENTS.C automaticky zvyšuje. Nedajte sa zmýliť programom - nie je prakticky použiteľný. Je použiteľný v krokovacom režime s emulačnou doskou. Po tom ako si všimnete zmenu čísla EvnCnt, nájdete v poli Values výsledky merania troch kanálov.  Pri nasledovnej zmene tohto čísla je obsah poľa Values prepísaná novými údajmi. 

Všimnite si spôsob ako komunikuje funkcia AD1_GetValue. V zdrojovom texte vidíte odovzdanie smerníka formou názvu poľa Values. Pointre a polia sú v podstate to isté (aj za mechanizmom poľa hľadajte pointre = premenné obsahujúce adresu na údaj v pamäti).  Názov poľa je vlastne  smerníkom (t.j. pointrom) na začiatok poľa. Tak, ako sa použil parameter (byte *) Values,  predstavuje odovzdanie jednak hodnoty pointra (t.j. adresy poľa, ale aj typu údaja v poli t.j. informácia že Values je smerník na typ byte  (byte *). Je to preto, lebo mechanizmus smerníkov je duálny, adresa je časť informácie a typ a veľkosť premennej na ktorú smerník ukazuje je jeho druhou časťou nevyhnutnou pri použití smerníka v C jazyku. Ak chcete sprístupniť nasledovný prvok poľa pomocou pointra, potrebujete k predošlej adrese pripočítať číslo, ktoré predstavuje veľkosť údajovej položky na ktorú pointer ukazuje. Táto informácia je schovaná v týmto spôsobom  "(byte *)"

 MAIN.C

#define NUM_MEASUREMENTS 10


unsigned int EvnCnt = 0;
byte Values[3];
void main(void)
{
  . . .
  AD1_Start();        // Run measurements 
  //measured data are processed in the events
  //this cycle waits for end
  for(;;) {
    if (EvntCnt == NUM_MEASUREMENTS) {
       //after 10 cycles the conversion is stopped
       AD1_Stop();
    }
    . . .
}
}

 EVENTS.C

extern unsigned int EvnCnt;
extern byte Values[3];

void AD1_OnEnd(void)
{
  EvnCnt++;           // Increment counter
  //measured values are available and may be read:
  AD1_GetValue((byte *)Values);  // Get AD conversion results
}

This chart shows a sequence of continuous conversion of all channels if an A/D peripheral does not support measuring all channels at once. 
Tieto obrázky ukazujú sekvenciu kontinuálnej konverzie všetkých kanálov ak A/D periféria nepodporuje naraz meranie všetkých kanálov. 

 

This chart shows a sequence of continuous conversion of all channels if an A/D peripheral supports measuring all channels simultaneously
Tento obrázok popisuje sekvenciu kontinuálneho merania všetkých kanálov ak A/D periféria podporuje meranie všetkých kanálov simultánne. 

 

This chart shows a sequence of continuous conversion of all channels if an A/D peripheral supports measuring all channels simultaneously and in addition continuous mode.
Tento obrázok popisuje sekvenciu kontinuálnej konverzie všetkých kanálov ak A/D periféria podporuje meranie všetkých kanálov simultánne a v  prídavnom kontinuálnom móde. 


(2) One conversion of all channels, with interrupt service  

Jedna konverzia všetkých kanálov s obsluhou prerušenia.

All channels are measured after Measure method is invoked. Property Interrupt service is enabled, Number of conversion is set to 1. When a conversion of all channels/samples is finished the OnEnd event is invoked and measured values are available (at least until the next conversion is started).
Všetky kanály sú merané po tom ako sa vyvolá metóda  Measure . Vlastnosť  Interrupt service - obsluha prerušenia je povolená,  Number of conversion - počet konverzií je nastavený na 1. Keď konverzia všetkých kanálov/vzoriek je ukončená, je vyvolaná udalosť  OnEnd a merané hodnoty sú dostupné (prinajmenšom dovtedy kým sa neštartne nasledovná konverzia). 

The following example demonstrates conversion of all channels.
Nasledovný príklad demonštruje konverziu všetkých kanálov. 

POZNÁMKA K PROGRAMU

Príklady treba brať s rezervou pretože slúžia len pre demonštračné príklady. 

Popis algoritmov: Hlavný modul MAIN.C na začiatku zadefinuje pole výsledkov merania z troch kanálov 0, 1 a 2 t.j. tri vzorky. Príkaz AD1_Measure(TRUE); odštartuje celý proces merania na pozadí, ale parameter TRUE zabezpečí že čakanie na výsledok sa uskutoční ešte v tomto podprograme. Po nameraní sa vraciame do hlavného programu, kde operáciou AD1_GetValue(...); prevezmeme výsledok. 

Za tým je v hlavnom programe uvedený druhý príklad keď vstúpime do nekonečnej slučky for(;;) {} . V ňom sa nachádza podmienený príkaz if(ValuesAvailable) {}; ktorý sa zrealizuje len keď sa detekujú platné dáta.  Premennou ValuesAvailable signalizuje modul EVENTS.C  hlavnému modulu, že meranie vzoriek je ukončené a dáta sú platné.  Pred každým vzorkovaním musíme preto v hlavnom programe vynulovať tento príznak ValuesAvailable=FALSE; 

Vzorový program po každom meraní premaže predošlé meranie.

 MAIN.C

bool ValuesAvailable = FALSE;  // control variable
byte Values[3];
void main(void)
{
  AD1_Measure(TRUE);
  AD1_GetValue((byte *)Values);  // Get AD conversion results
  . . .
  for(;;) {
    if (ValuesAvailable) {
      // MIESTO KDE SA DAJÚ POUŽIŤ ÚDAJE UMIESTNENÉ VO Values 
      ValuesAvailable = FALSE;   // clear the control variable
      AD1_Measure(FALSE);  //start next measurement
    }
    . . .
  }
}

 EVENTS.C

extern bool ValuesAvailable;
extern byte Values[3];

void AD1_OnEnd(void)
{
  AD1_GetValue((byte *)Values);  // Get AD conversion results
  ValuesAvailable = TRUE;        // set control variable
}

This chart shows a sequence of measurements on all channels if an A/D peripheral does not support measuring all channels simultaneously.
Tento obrázok ukazuje sekvenciu meraní všetkých kanálov ak A/D periféria nepodporuje meranie všetkých kanálov simultánne. 

 

Popis princípu

V obrázku vidíte tri veci

  1. Užívateľský program
  2. Software riadiaci ADC bean
  3. Hardware ADC beanu

Verzia s parametrom FALSE

Po tom ako sa rozhodnete merať spustíte program Measure, ktorý pripraví bean na činnosť a odštartuje operáciu launch(0), ktorá má odmerať vzorku 0. Nakoľko budeme používať prerušenie, môže bean ukončiť program (svetlo zelený) a vrátiť sa do hlavného programu kde sa bude pokračovať zatiaľ na iných úlohách. Hardware zatiaľ meria údaj a to trvá určitú dobu (naznačenú modrou). Ak meranie skončí dôjde k prerušeniu hlavného progranu a vstúpime do obsluhy prerušenia beanu. Tento si pamätá, že čaká na hodnotu 0, preto ju niekam uloží a odštartuje operáciu launch(1) pre vzorku 1. Hneď potom sa vráti do hlavného programu, ktorý si plní svoje úlohy. Meranie hodnoty skončí a vyvolá sa prerušenie beanu. Zase sa uloží nameraná hodnota a odštartuje sa launch(2) meranie poslednej vzorky 2. Ako v predošlých prípadoch sa vrátime do hlavného programu. Po domeraní dôjde k poslednému prerušeniu. Bean má tri vzorky zavolá podprogram OnEnd() ktorá slúži na použitie výsledku merania a do ktorej obsahu ste mohli pridať vlastný obslužný kód. Ten po skončení sa vráti do obsluhy beanu, ktorý deaktivuje a vráti sa už natrvalo do hlavného programu. 

Verzia s parametrom TRUE

Líši sa len v tom že obsluha beanu nevracia sa do hlavného programu, t.j. všetky ostatné činnosti vtedy stoja a bean čaká na výsledok merania. 


This chart shows a sequence of measurements on all channels if an A/D peripheral supports measuring all channels simultaneously. Number of measurement is set to 2.
Tento obrázok ukazuje meranie všetkých kanálov ak A/D periféria podporuje meranie všetkých kanálov simultánne. Počet meraní je nastavené na 2. 


(3) One conversion of a specified channel, with interrupt service  

Jedna konverzia špecifikovaného kanála s obsluhou prerušenia.

The conversion of single channel can be done using MeasureChan method. Property Interrupt service is enabled, Number of conversion is set to 1. When a conversion of a channel/sample is finished the OnEnd event is invoked and the measured value is available by until the next conversion is started.
Konverzia jednoduchého kanála može byť uskutočnená použitím metódy  MeasureChan. Vlastnosť   Interrupt service t.j. obsluha prerušenia je povolená, Number of conversion - počet konverzií (A/D) je nastavený na 1. Keď je konverzia kanálu/vzorky ukončená vyvolá sa udalosť  OnEnd a meraná hodnota je dostupná do času pokiaľ sa nasledovná konverzia neodštartuje. 

The following example demonstrates periodic measurement of three channels in the loop.
Nasledovný príklad demonštruje periodické meranie troch kanálov v cykle.

 MAIN.C

bool ValueAvailable = FALSE;  // control variable
byte Value;
byte channel = 0;

void main(void)
{
  . . .
  AD1_MeasureChan(TRUE, channel);
  AD1_GetChanValue(channel, &Value);
  for(;;) {
    if (ValueAvailable) {
      ValueAvailable = FALSE;   // clear the control variable
      // an action, i.e. process the measured value
      ++channel;
      if (channel > 3) channel = 0;
      AD1_MeasureChan(FALSE, channel);
    }
    . . .
  }
}

 EVENTS.C

extern bool ValueAvailable;
extern byte Value;
extern byte channel;

void AD1_OnEnd(void)
{
  // Get AD conversion results of the specified channel
  AD1_GetChanValue(channel, &Value);
  ValueAvailable = TRUE;          // set control variable
}

The following chart shows single conversion of selected channel, the first conversion without waiting for a result and the second conversion with waiting for a result.
Nasledovný obrázok ukazuje jednoduchú konverziu navoleného kanála, prvá konverzia je bez čakania na výsledok a druhá konverzia je s čakaním na výsledok

Popis princípu

V obrázku vidíte tri veci
  1. Užívateľský program
  2. Software riadiaci ADC bean
  3. Hardware ADC beanu

Verzia s parametrom FALSE

Po tom ako sa rozhodnete merať spustíte program MeasureChan, ktorý pripraví bean na činnosť a odštartuje operáciu launch(1), ktorá má odmerať vzorku 1. Nakoľko budeme používať prerušenie, môže bean ukončiť program (svetlo zelený) a vrátiť sa do hlavného programu kde sa bude pokračovať zatiaľ na iných úlohách. Hardware zatiaľ meria údaj a to trvá určitú dobu (naznačenú modrou). Ak meranie skončí dôjde k prerušeniu hlavného progranu a vstúpime do obsluhy prerušenia beanu. Bean zavolá  podprogram OnEnd() ktorá slúži na použitie výsledku merania a do ktorej obsahu ste mohli pridať vlastný obslužný kód. Ten po skončení sa vráti do obsluhy beanu, ktorý deaktivuje a vráti sa už natrvalo do hlavného programu. 

 

Verzia s parametrom TRUE

Líši sa len v tom že obsluha beanu nevracia sa do hlavného programu, t.j. všetky ostatné činnosti vtedy stoja a bean čaká na výsledok merania. 

 

 

 

 

 


(4) One conversion of all channels, in polling mode  

Jedna konverzia všetkých kanálov v pool režime.

The measurement on all channels is performed in Measure method, i.e., Measure method does not finish until the conversion of all channels is finished. Property Interrupt service is disabled, Number of conversion is set to 1. 
Meranie všetkých kanálov je vykonané v  Measure  /Meranie/ metóde, t.j.  Measure metóda sa neskončí skôr pokiaľ konverzia všetkých kanálov sa neskončí. Vlastnosť  Interrupt service - obsluha prerušenia je zakázaná,  Number of conversion - počet meraní je nastavený na 1. 

Poznámka k programu

       Nasledovný  obrázok /pravdepodobne s chybou! lebo by mal byť podobný ako ten za ním/ používa len software beanu a main modul bez modulu obsluhy prerušenia. AD1_Measure(FALSE); odštartuje hardware prevodníka a FALSE by ho mal vrátiť okamžite do hlavného programu. My však potrebujeme nejako detekovať že výsledok merania už existuje. Nasledovný príkaz má vlastne takýto tvar  while( ... ) < prázdny príkaz> ; t.j. pred bodkočiarkou nie je nič čo sa može vykonať. Vykonávací výraz je schovaný vo vnútri podmienky AD1_GetValue(). Jeho úlohou je prevziať namerané hodnoty. Stav toho prevzatia je signalizovaný menom volanej funkcie. Samozrejme pokiaľ hardware ešte nenameral hodnotu vracia táto funkcia hodnotu ERR_NOTAVAIL. Preto v cykle opakujeme znova a znova preberanie hodnoty. 
        Vo chvíli keď meranie umiestni výsledok do poľa Values, program to detekuje a pokračuje v behu hlavného programu. 

 MAIN.C

bool ValuesAvailable = FALSE;  // control variable
byte Values[3];

void main(void)
{
  . . .
  AD1_Measure(FALSE);  // measure all channel, not wait for result
  while (AD1_GetValue((byte *)Values) == ERR_NOTAVAIL);  // Wait for result
  . . .
  AD1_Measure(TRUE);  // measure all channel, wait for result
  AD1_GetValue((byte *)Values);  // Get AD conversion results
  .
. .
}

This chart shows a sequence of conversion of all channels if an A/D peripheral does not support measuring all channels simultaneously. 
Tento obrázok popisuje konverziu všetkých kanálov ak A/D periféria nepodporuje meranie všetkých kanálov simultánne. (Poznámka autora slovenského textu: Nasledovný obrázok je podozrivý, lebo pri parametri FALSE by mal nastať návrat do hlavného programu /pozrite si nasledovný obrázok ktorý je správny/. Pri zakázanom prerušení by však neexistovala metóda ako sa vrátiť do obsluhy beanu ADC. )

 

This chart shows a sequence of conversion of all channels if an A/D peripheral supports measuring all channels at once.
Tento obrázok popisuje sekvenciu konverzie všetkých kanálov ak A/D periféria podporuje meranie všetkých kanálov naraz.  


This chart shows a sequence of conversion of all channels if an A/D peripheral supports measuring all channels simultaneously. Number of conversion is set to 2.
Tento obrázok popisuje sekvenciu konverzie všetkých kanálov ak A/D periféria podporuje meranie všetkých kanálov simultánne.  Number of conversion - počet konverzií je nastavený na 2. 


(5) One conversion of all channels of each bean, in shared mode  

Jedna konverzia všetkých kanálov každého beanu v zdielanom režime.

Several ADC beans can be used for one ADC device. This example assumes that two AD converter beans 'AD1' and 'AD2' in the project share one ADC device (Sharing properties set to enabled). Two channels (AN0 and AN2 pins) are set in the bean 'AD1' and one channel (AN1 pin) is set in the bean 'AD2'. Number of conversion of each bean is set to 1.
Niekoľko ADC beanov môže byť použitých pre jedno ADC zariadenie. Tento príklad predpokláda, že dva AD prevodníkové beany 'AD1' a 'AD2' v projekte zdieľajú jedno ADC zariadenie.   (Sharing properties - zdielané vlastnosti nastavené na povolené). Tva kanály AN0 a AN1 piny) sú nastavené v beane 'AD1' a jeden kanál  (AN1 pin) je nastavený v beane 'AD2'.


 MAIN.C

bool ADResult1;       // Flag for bean 'AD1'
bool ADResult2;       // Flag for bean 'AD2'
byte Values[2];       // Bean 'AD1' is set to two channels measurement
byte Value;           // Bean 'AD2' is set to one channels measurement
void main(void)
{
  ADResult1 = FALSE;
  ADResult2 = FALSE;
  AD1_Measure(FALSE); // Run measurement of two channels from bean 'AD1'
  AD2_Measure(FALSE); // Run measurement of two channels from bean 'AD2'
  .
. .
  while (!ADResult1);            // Wait for measurement complete
  AD1_GetValue8((byte *)Values); // Get AD conversion results of bean 'AD1'
  while (!ADResult2);            // Wait for measurement complete
  AD1_GetValue8(&Value);         // Get AD conversion result of bean 'AD2'
}

 EVENTS.C

extern bool ADResult1;
extern bool ADResult2;
void AD1_OnEnd(void)
{
  /* Measurement of two channels from bean 'AD1' is completed */
  ADResult1 = TRUE;
}

void AD2_OnEnd(void)
{
  /* Measurement of one channel from bean 'AD2' is completed */
  ADResult2 = TRUE;
}

Poznámky k programu:

Modul EVENTS.C obsahuje  definície dvoch externých premenných typu bool ktoré sú zadefinované v hlavnom module main. Tieto premenné slúžia ako správy pre hlavný program o stave meraní. Vyplýva to aj z ich názvov ADResult t.j. výsledok merania pri prevode AD. Úlohou poslať správu bol poverený samotný bean AD prevodníka. 

Program MAIN.C  obsahuje naviac premenné v ktorých sa objaví výsledná nameraná hodnota. V príklade vidno dve možnosti riešenia. Jedno predstavuje výsledok jedného kanála umiestnený do jednoduchej premennej a druhý predstavuje výsledok dvoch kanálov odovzdaný pomocou poľa. Funkcia AD1_GetValue8(&Value);  má v parametri uvedenú adresu (&Value) jednoduchej premennej, ktorá je definovaná v module vo funkcii main. Program rieši vzorkovanie tak, že hlavný program celý čas čaká na výsledok merania. Oznámi ho správa ADResult. 

Funkcia AD1_GetValue8((byte *) Values); má v parametri odovzdanú adresu (t.j. pointer) na pole vracaných údajov a súčasťou je aj odovzdaný typ údajových položiek poľa (byte *). To je preto, lebo použitie pointra  (smerník, resp. premenná na adresy) v C jazyku musí byť vždy spojené nielen s hodnotou adresy ale aj s informáciou o veľkosti premennej na ktorú smerník ukazuje. 

 


For more about typical usage of the bean code please refer to the page Bean Code Typical Usage
Aby ste zistili viac o typickom použití kódu beanov pozrite si stránku  Bean Code Typical Usage - Typické použitie kódu Beanu.


Processor ExpertTM and Embedded BeansTM are registered trademarks of UNIS, Ltd.
©1997-2005, UNIS, Ltd.